1
תגובות
שלום,
בניתי מחלקה לSQL:
עכשיו לדוגמא באמצע הקוד אני קורא למחלקה אחרת שיש בה גם שימוש בSQL הוא לא מזהה לי את ההתחברות למסד למרות שקראתי בראש הדף למחלקה של ה-SQL
לדוגמא במחלקה שאני קורא לה באמצע הקוד יש את הדבר הבא:
מחזיר לי שגיאה שאין חיבור.
השאלה שלי היא איך אני מתגבר על זה? איך אני גורם לכך שברגע שאני שם את ההתחברות בראש הדף עד שאני מחליט לסגור אותה כל המחלקות ישתמשו באותו חיבור מבלי לנתק/לא למצוא חיבור?
זה די מסובך לי להסביר מקווה שניתן להבין ממה שרשמתי
בניתי מחלקה לSQL:
class DAL {
private $query;
private $conn;
function __construct() {
return $this->dbconnect();
}
function __destruct() {
//return mysqli_close($this->conn);
}
private function error_log($str) {
die($str . '<br />' . mysqli_error($this->conn));
}
private function dbconnect() {
$this->conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)or die ("<br/>Could not connect to MySQL server");
return $this->conn;
}
public function execute($sql,$error=true) {
$res = mysqli_query($this->conn,$sql);
if ($res) {
return $res;
}else{
return $error ? $this->error_log($sql) : false;
}
}
public function set_query($sql,$error=true) {
$this->query = mysqli_query($this->conn,$sql);
if ($this->query) {
return $this->query;
}else{
return $error ? $this->error_log($sql) : null;
}
}
public function query_fetch_array($q) {
$arrayFetch = is_null($q) ? mysqli_fetch_array($this->query) : mysqli_fetch_array($q);
return (sizeof($arrayFetch)==2) ? $arrayFetch[0]: $arrayFetch;
}
}
private $query;
private $conn;
function __construct() {
return $this->dbconnect();
}
function __destruct() {
//return mysqli_close($this->conn);
}
private function error_log($str) {
die($str . '<br />' . mysqli_error($this->conn));
}
private function dbconnect() {
$this->conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)or die ("<br/>Could not connect to MySQL server");
return $this->conn;
}
public function execute($sql,$error=true) {
$res = mysqli_query($this->conn,$sql);
if ($res) {
return $res;
}else{
return $error ? $this->error_log($sql) : false;
}
}
public function set_query($sql,$error=true) {
$this->query = mysqli_query($this->conn,$sql);
if ($this->query) {
return $this->query;
}else{
return $error ? $this->error_log($sql) : null;
}
}
public function query_fetch_array($q) {
$arrayFetch = is_null($q) ? mysqli_fetch_array($this->query) : mysqli_fetch_array($q);
return (sizeof($arrayFetch)==2) ? $arrayFetch[0]: $arrayFetch;
}
}
עכשיו לדוגמא באמצע הקוד אני קורא למחלקה אחרת שיש בה גם שימוש בSQL הוא לא מזהה לי את ההתחברות למסד למרות שקראתי בראש הדף למחלקה של ה-SQL
לדוגמא במחלקה שאני קורא לה באמצע הקוד יש את הדבר הבא:
mysql_real_escape_string(trim(htmlspecialchars($input))
מחזיר לי שגיאה שאין חיבור.
השאלה שלי היא איך אני מתגבר על זה? איך אני גורם לכך שברגע שאני שם את ההתחברות בראש הדף עד שאני מחליט לסגור אותה כל המחלקות ישתמשו באותו חיבור מבלי לנתק/לא למצוא חיבור?
זה די מסובך לי להסביר מקווה שניתן להבין ממה שרשמתי
1 תשובות
החיבור שלך הוא ב-scope של DAL, הוא לא זמין בכל מקום בתוכנית.
דבר נוסף, אתה משתמש ב-mysql_real_escape_string ובמחלקה עובד עם mysqli, הפונקציה שאתה צריך היא mysqli_real_escape_string.
יש לך קצת סרבול בקוד שיקשה עליך לעבוד עם המחלקה הזאת בכל מקום בקוד שלך.
תשמור את החיבור שלך בתוך משתנה סטטי ולא בנפרד עבור כל אובייקט של DAL, ככה תוכל להגדיר מטודה סטטית שתבצע escape, לדוגמה:
public static function escape($str){
return mysqli_real_escape_string($this->conn, $str);
}
חוץ מזה כדאי שתעבוד עם mysqli בצורה מונחת עצמים ולא פרוצידורלית ותחסוך לעצמך קצת עבודה.